#pragma once

#include <iostream>
#include <string>
#include <vector>
#include <ctime>
#include <unistd.h>

// 该文件中都是任务相关函数，与进程无关，实现进程池与任务的解耦

#define TASKSIZE 3
typedef void (*task_t)();
task_t task[TASKSIZE]; // 函数指针数组，用于存放任务，下标为任务编码

void DownLoad()
{
    std::cout << "download task" << std::endl;
}

void Flush()
{
    std::cout << "Flush task" << std::endl;
}

void Print()
{
    std::cout << "Print task" << std::endl;
}
// 加载任务
void LoadTask()
{
    srand(time(nullptr) ^ getpid());
    task[0] = DownLoad;
    task[1] = Flush;
    task[2] = Print;
}

// 子进程执行任务
void ProcessExecute(int tasknum)
{
    if (tasknum < 0 || tasknum > 2)
        exit(1);
    task[tasknum]();
}
// 子进程的工作
void work()
{
    int tasknum = 0;
    // 从管道读端读取主程序派发的任务，若主程序未派发，则子进程一直阻塞等待，知道主程序派发或者退出
    // 但是管道读端已经被重定向到标准输入，于是直接从标准输入读取即可
    // 读取返回值为0表示写端已经关闭，则主程序结束派发任务，子进程可以退出

    while (0 != read(0, &tasknum, sizeof(int)))
    {
        std::cout << "I am " << getpid() << " I excute " << tasknum << std::endl;
        ProcessExecute(tasknum); // 读取到任务，任务编号未tasknum，执行该任务
        std::cout << "_________________________________" << std::endl;
    }
    std::cout << getpid() << " quit sucess" << std::endl;
}